LifeExpIncom <- read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/LifeExpIncom.csv")
data2015 <- LifeExpIncom %>%
filter(year == "2015")
Interactive Scatterplot
of Life Expectancy vs. Income in 2015
cols1 <- c("#648FFF","darkorchid3","#DC267F","#FE6100","#FFB000")
cols1 <- setNames(cols1, c("Africa", "Americas", "Asia", "Europe", "Oceania"))
plot_ly(
data = data2015,
x = ~income, y = ~life.expectancy, color = ~factor(region), colors = cols1,
text = ~paste("Country: ", country,
"<br>Population Size: ", population.size),
## using the following hovertemplate() to add the information of the
## Two numerical variables to the hover text.
hovertemplate = paste('<i><b>Life Expectancy<b></i>: %{y}',
'<br><b>Income</b>: %{x}',
'<br><b>%{text}</b>'),
alpha = 0.6,
marker = list(size = ~population.size^(1/10), sizeref = .05, sizemode = 'area'),
type = "scatter",
mode = "markers",
## graphic size
width = 700,
height = 500
) %>%
layout(
### Title
title =list(text = "Association Between Life Expectancy and Income",
font = list(family = "Arial",
size = 18,
color = "blue")),
### legend
legend = list(title = list(text = 'Region',
font = list(family = "Courier New",
size = 14,
color = "black")),
bgcolor = "beige",
bordercolor = "navy",
groupclick = "togglegroup",
orientation = "v"
),
margin = list(
b = 100,
l = 100,
t = 100,
r = 50
),
## Background
plot_bgcolor ='#f7f7f7',
## Axes labels
xaxis = list(
title=list(text = 'Income',
font = list(family = 'Arial')),
zerolinecolor = 'white',
zerolinewidth = 2,
gridcolor = 'white'),
yaxis = list(
title=list(text = 'Life Expectancy',
font = list(family = 'Arial')),
zerolinecolor = 'white',
zerolinewidth = 2,
gridcolor = 'white',
range=c(48,85)),
## annotations
annotations = list(
x = 0.7, # between 0 and 1. 0 = left, 1 = right
y = 1.5, # between 0 and 1, 0 = bottom, 1 = top
font = list(size = 12,
color = "navy"),
text = "The point size is proportional to country's population size",
xref = "paper", # "container" spans the entire `width` of the
# lot. "paper" refers to the width of the
# plotting area only. yref = "paper",
# same as xref.
xanchor = "center", # horizontal alignment with respect to its x position
yanchor = "bottom", # similar to xanchor
showarrow = FALSE)
)
This scatterplot uses income and life expectancy of each country
during the year of 2015 as the two variables defining the axes.
Therefore, they will be the variables to be compared. The size of each
point represents that country’s population size during the year 2015.
The color of each point represents the region or continent in which each
country resides. During the year 2015, it seemed like over half the
countries had low incomes below $30,000, especially those in Africa.
Most African countries also had the lowest life expectancies. Those with
larger incomes tended to be in Asia and Europe. The common pattern here
is that life expectancy tended to increase only if income increased as
well. This demonstrates that countries, and those who live in them, need
a relatively large yearly income and number of resources in order for
those living in these countries to live longer lives. Unfortunately,
that is the opposite case with Africa, who tend to have countries with
low income and, therefore, lower life expectancies. It should also be
said that life expectancy seems to level out between 75 and 85 years
when countries have incomes of $30,000 or greater.
Animated Scatterplot of
Life Expectancy vs. Income Over the Years
cols1 = c("#648FFF","darkorchid3","#DC267F","#FE6100","#FFB000","#882255")
lifeExp.anime <- ggplot(LifeExpIncom, aes(income, life.expectancy,
size = population.size, colour = region)) +
geom_point(alpha = 0.7) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) + scale_x_log10() +
labs(title = 'Year: {frame_time}',
x = 'Income',
y = 'Life Expectancy') +
transition_time(year) +
ease_aes('linear') + scale_color_manual(values = cols1)
###
animate(lifeExp.anime, fps=3, duration = 20, renderer = gifski_renderer())

This scatterplot uses income and life expectancy of each country
between 1800 and 2018 as the two variables defining the axes. Therefore,
they will be the variables to be compared. The size of each point
represents that country’s population size. The color of each point
represents the region or continent in which each country resides. From
1800 to 2018, it is seems apparent that income and life exxpectancy in
all countries increased over time. Life expectancy seems to increase
over time as income does as well. Income and life expectancy seemed to
increase faster over the years for countries in Europe compared to other
countries in other regions. On the other hand, countries in Africa had
their income and life expectancies increase much slower compared to
other regions. Most African countries had the lowest life expectancies
of all for most years. Also, the speed of income and life expectancy for
Asian countries over the years seemed to be mostly in between the speeds
for European and African countries as already mentioned.
LS0tDQp0aXRsZTogIldvcmxkIExpZmUgRXhwZWN0YW5jeSBJbnRlcmFjdGl2ZSBhbmQgQW5pbWF0ZWQgU2NhdHRlcnBsb3RzIg0KYXV0aG9yOiAiQW5kcmV3IEhlbmVnaGFuIg0KZGF0ZTogIjMvNi8yMDI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogVGFibGUgb2YgY29udGVudCAtIG5hdmlnYXRpb24gKi8NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogVGl0bGUgZm9udHMgKi8NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBkYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgZm9udC12YXJpYW50LWNhcHM6IG5vcm1hbDsNCn0NCg0KaDQuYXV0aG9yIHsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7DQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBkYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQovKiBTZWN0aW9uIGhlYWRlcnMgKi8NCg0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7DQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsNCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBEZWNvcmF0aW9uIG9mIGh5cGVybGlua3MgICovDQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IHB1cnBsZTsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQphOmhvdmVyIHsNCiAgY29sb3I6IHJlZDsNCn0NCg0KLyogc2VsZWN0ZWQgbGluayAqLw0KYTphY3RpdmUgew0KICBjb2xvcjogeWVsbG93Ow0KfQ0KDQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCg0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0DQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCg0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJkcGx5ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQogICBsaWJyYXJ5KGRwbHlyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJjb3dwbG90IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNvd3Bsb3QiKQ0KICAgbGlicmFyeShjb3dwbG90KQ0KfQ0KaWYgKCFyZXF1aXJlKCJsYXRleDJleHAiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibGF0ZXgyZXhwIikNCiAgIGxpYnJhcnkobGF0ZXgyZXhwKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgIGxpYnJhcnkocGxvdGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnYXBtaW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZ2FwbWluZGVyIikNCiAgIGxpYnJhcnkoZ2FwbWluZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbmciKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInBuZyIpDQogICAgbGlicmFyeSgicG5nIikNCn0NCmlmICghcmVxdWlyZSgiUkN1cmwiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIikNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ2FuaW1hdGUiKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnaWZza2kiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdpZnNraSIpICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnckRldmljZXMiKQ0KfQ0KaWYgKCFyZXF1aXJlKCJqcGVnIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJqcGVnIikgICAgICAgICAgICAgDQogICAgbGlicmFyeSgianBlZyIpDQp9DQppZiAoIXJlcXVpcmUoIlZHQU0iKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlZHQU0iKSAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJWR0FNIikNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIk1BU1MiKQ0KfQ0KaWYgKCFyZXF1aXJlKCJubmV0IikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJubmV0IikgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibm5ldCIpDQp9DQppZiAoIXJlcXVpcmUoImNsdXN0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImNsdXN0ZXIiKSAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJjbHVzdGVyIikNCn0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCmBgYHtyfQ0KTGlmZUV4cEluY29tIDwtIHJlYWQuY3N2KGZpbGUgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F6aGVuZWdoYW4vYWhlbmVnaGFuL21haW4vZGF0YXNldHMvTGlmZUV4cEluY29tLmNzdiIpDQpkYXRhMjAxNSA8LSBMaWZlRXhwSW5jb20gJT4lDQogIGZpbHRlcih5ZWFyID09ICIyMDE1IikNCmBgYA0KDQojIEludGVyYWN0aXZlIFNjYXR0ZXJwbG90IG9mIExpZmUgRXhwZWN0YW5jeSB2cy4gSW5jb21lIGluIDIwMTUNCg0KYGBge3J9DQpjb2xzMSA8LSBjKCIjNjQ4RkZGIiwiZGFya29yY2hpZDMiLCIjREMyNjdGIiwiI0ZFNjEwMCIsIiNGRkIwMDAiKQ0KY29sczEgPC0gc2V0TmFtZXMoY29sczEsIGMoIkFmcmljYSIsICJBbWVyaWNhcyIsICJBc2lhIiwgIkV1cm9wZSIsICJPY2VhbmlhIikpDQoNCnBsb3RfbHkoDQogICAgZGF0YSA9IGRhdGEyMDE1LA0KICAgIHggPSB+aW5jb21lLCB5ID0gfmxpZmUuZXhwZWN0YW5jeSwgY29sb3IgPSB+ZmFjdG9yKHJlZ2lvbiksIGNvbG9ycyA9IGNvbHMxLA0KICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHJ5OiAiLCBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICI8YnI+UG9wdWxhdGlvbiBTaXplOiAiLCBwb3B1bGF0aW9uLnNpemUpLA0KICAgICAjIyB1c2luZyB0aGUgZm9sbG93aW5nIGhvdmVydGVtcGxhdGUoKSB0byBhZGQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZQ0KICAgICAjIyBUd28gbnVtZXJpY2FsIHZhcmlhYmxlcyB0byB0aGUgaG92ZXIgdGV4dC4NCiAgICAgaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKCc8aT48Yj5MaWZlIEV4cGVjdGFuY3k8Yj48L2k+OiAle3l9JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+SW5jb21lPC9iPjogJXt4fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPiV7dGV4dH08L2I+JyksDQogICAgIGFscGhhID0gMC42LA0KICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSB+cG9wdWxhdGlvbi5zaXplXigxLzEwKSwgc2l6ZXJlZiA9IC4wNSwgc2l6ZW1vZGUgPSAnYXJlYScpLA0KICAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgICBtb2RlID0gIm1hcmtlcnMiLA0KICAgICAjIyBncmFwaGljIHNpemUNCiAgICAgd2lkdGggPSA3MDAsDQogICAgIGhlaWdodCA9IDUwMA0KICAgKSAlPiUNCiAgICBsYXlvdXQoICANCiAgICAgICMjIyBUaXRsZSANCiAgICAgIHRpdGxlID1saXN0KHRleHQgPSAiQXNzb2NpYXRpb24gQmV0d2VlbiBMaWZlIEV4cGVjdGFuY3kgYW5kIEluY29tZSIsIA0KICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIkFyaWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibHVlIikpLCANCiAgICAgICMjIyBsZWdlbmQNCiAgICAgIGxlZ2VuZCA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAnUmVnaW9uJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJDb3VyaWVyIE5ldyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKSwNCiAgICAgICAgICAgICAgICAgICAgYmdjb2xvciA9ICJiZWlnZSIsDQogICAgICAgICAgICAgICAgICAgIGJvcmRlcmNvbG9yID0gIm5hdnkiLA0KICAgICAgICAgICAgICAgICAgICBncm91cGNsaWNrID0gInRvZ2dsZWdyb3VwIiwNCiAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSAidiINCiAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgIG1hcmdpbiA9IGxpc3QoDQogICAgICAgICAgICAgIGIgPSAxMDAsDQogICAgICAgICAgICAgIGwgPSAxMDAsDQogICAgICAgICAgICAgIHQgPSAxMDAsDQogICAgICAgICAgICAgIHIgPSA1MA0KICAgICAgKSwNCiAgICAgICMjIEJhY2tncm91bmQNCiAgICAgIHBsb3RfYmdjb2xvciA9JyNmN2Y3ZjcnLCANCiAgICAgICMjIEF4ZXMgbGFiZWxzDQogICAgICAgICAgICB4YXhpcyA9IGxpc3QoIA0KICAgICAgICAgICAgICAgICAgICB0aXRsZT1saXN0KHRleHQgPSAnSW5jb21lJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAnQXJpYWwnKSksDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5lY29sb3IgPSAnd2hpdGUnLCANCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnKSwgDQogICAgICAgICAgICB5YXhpcyA9IGxpc3QoIA0KICAgICAgICAgICAgICAgICAgICB0aXRsZT1saXN0KHRleHQgPSAnTGlmZSBFeHBlY3RhbmN5JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAnQXJpYWwnKSksDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5lY29sb3IgPSAnd2hpdGUnLCANCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnLA0KICAgICAgICAgICAgICAgICAgICByYW5nZT1jKDQ4LDg1KSksDQogICAgICAgIyMgYW5ub3RhdGlvbnMNCiAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoICANCiAgICAgICAgICAgICAgICAgICAgIHggPSAwLjcsICAgIyBiZXR3ZWVuIDAgYW5kIDEuIDAgPSBsZWZ0LCAxID0gcmlnaHQNCiAgICAgICAgICAgICAgICAgICAgIHkgPSAxLjUsICAgIyBiZXR3ZWVuIDAgYW5kIDEsIDAgPSBib3R0b20sIDEgPSB0b3ANCiAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSAxMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIm5hdnkiKSwgICANCiAgICAgICAgICAgICAgICAgIHRleHQgPSAiVGhlIHBvaW50IHNpemUgaXMgcHJvcG9ydGlvbmFsIHRvIGNvdW50cnkncyBwb3B1bGF0aW9uIHNpemUiLCAgIA0KICAgICAgICAgICAgICAgICAgeHJlZiA9ICJwYXBlciIsICAjICJjb250YWluZXIiIHNwYW5zIHRoZSBlbnRpcmUgYHdpZHRoYCBvZiB0aGUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGxvdC4gInBhcGVyIiByZWZlcnMgdG8gdGhlIHdpZHRoIG9mIHRoZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgcGxvdHRpbmcgYXJlYSBvbmx5LiB5cmVmID0gInBhcGVyIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBzYW1lIGFzIHhyZWYuDQogICAgICAgICAgICAgICB4YW5jaG9yID0gImNlbnRlciIsICMgIGhvcml6b250YWwgYWxpZ25tZW50IHdpdGggcmVzcGVjdCB0byBpdHMgeCBwb3NpdGlvbg0KICAgICAgICAgICAgICAgeWFuY2hvciA9ICJib3R0b20iLCAjICBzaW1pbGFyIHRvIHhhbmNob3IgIA0KICAgICAgICAgICAgIHNob3dhcnJvdyA9IEZBTFNFKQ0KICAgICkNCmBgYA0KDQpUaGlzIHNjYXR0ZXJwbG90IHVzZXMgaW5jb21lIGFuZCBsaWZlIGV4cGVjdGFuY3kgb2YgZWFjaCBjb3VudHJ5IGR1cmluZyB0aGUgeWVhciBvZiAyMDE1IGFzIHRoZSB0d28gdmFyaWFibGVzIGRlZmluaW5nIHRoZSBheGVzLiBUaGVyZWZvcmUsIHRoZXkgd2lsbCBiZSB0aGUgdmFyaWFibGVzIHRvIGJlIGNvbXBhcmVkLiBUaGUgc2l6ZSBvZiBlYWNoIHBvaW50IHJlcHJlc2VudHMgdGhhdCBjb3VudHJ5J3MgcG9wdWxhdGlvbiBzaXplIGR1cmluZyB0aGUgeWVhciAyMDE1LiBUaGUgY29sb3Igb2YgZWFjaCBwb2ludCByZXByZXNlbnRzIHRoZSByZWdpb24gb3IgY29udGluZW50IGluIHdoaWNoIGVhY2ggY291bnRyeSByZXNpZGVzLiBEdXJpbmcgdGhlIHllYXIgMjAxNSwgaXQgc2VlbWVkIGxpa2Ugb3ZlciBoYWxmIHRoZSBjb3VudHJpZXMgaGFkIGxvdyBpbmNvbWVzIGJlbG93ICQzMCwwMDAsIGVzcGVjaWFsbHkgdGhvc2UgaW4gQWZyaWNhLiBNb3N0IEFmcmljYW4gY291bnRyaWVzIGFsc28gaGFkIHRoZSBsb3dlc3QgbGlmZSBleHBlY3RhbmNpZXMuIFRob3NlIHdpdGggbGFyZ2VyIGluY29tZXMgdGVuZGVkIHRvIGJlIGluIEFzaWEgYW5kIEV1cm9wZS4gVGhlIGNvbW1vbiBwYXR0ZXJuIGhlcmUgaXMgdGhhdCBsaWZlIGV4cGVjdGFuY3kgdGVuZGVkIHRvIGluY3JlYXNlIG9ubHkgaWYgaW5jb21lIGluY3JlYXNlZCBhcyB3ZWxsLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGF0IGNvdW50cmllcywgYW5kIHRob3NlIHdobyBsaXZlIGluIHRoZW0sIG5lZWQgYSByZWxhdGl2ZWx5IGxhcmdlIHllYXJseSBpbmNvbWUgYW5kIG51bWJlciBvZiByZXNvdXJjZXMgaW4gb3JkZXIgZm9yIHRob3NlIGxpdmluZyBpbiB0aGVzZSBjb3VudHJpZXMgdG8gbGl2ZSBsb25nZXIgbGl2ZXMuIFVuZm9ydHVuYXRlbHksIHRoYXQgaXMgdGhlIG9wcG9zaXRlIGNhc2Ugd2l0aCBBZnJpY2EsIHdobyB0ZW5kIHRvIGhhdmUgY291bnRyaWVzIHdpdGggbG93IGluY29tZSBhbmQsIHRoZXJlZm9yZSwgbG93ZXIgbGlmZSBleHBlY3RhbmNpZXMuIEl0IHNob3VsZCBhbHNvIGJlIHNhaWQgdGhhdCBsaWZlIGV4cGVjdGFuY3kgc2VlbXMgdG8gbGV2ZWwgb3V0IGJldHdlZW4gNzUgYW5kIDg1IHllYXJzIHdoZW4gY291bnRyaWVzIGhhdmUgaW5jb21lcyBvZiAkMzAsMDAwIG9yIGdyZWF0ZXIuDQoNCg0KIyBBbmltYXRlZCBTY2F0dGVycGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgdnMuIEluY29tZSBPdmVyIHRoZSBZZWFycw0KDQpgYGB7cn0NCmNvbHMxID0gYygiIzY0OEZGRiIsImRhcmtvcmNoaWQzIiwiI0RDMjY3RiIsIiNGRTYxMDAiLCIjRkZCMDAwIiwiIzg4MjI1NSIpDQpsaWZlRXhwLmFuaW1lIDwtIGdncGxvdChMaWZlRXhwSW5jb20sIGFlcyhpbmNvbWUsIGxpZmUuZXhwZWN0YW5jeSwgDQogICAgICAgICAgICAgICAgICBzaXplID0gcG9wdWxhdGlvbi5zaXplLCBjb2xvdXIgPSByZWdpb24pKSArDQogICAgICAgICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsNCiAgICAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjb3VudHJ5X2NvbG9ycykgKw0KICAgICAgICAgICBzY2FsZV9zaXplKHJhbmdlID0gYygyLCAxMikpICsgc2NhbGVfeF9sb2cxMCgpICsNCiAgICAgICAgICAgbGFicyh0aXRsZSA9ICdZZWFyOiB7ZnJhbWVfdGltZX0nLCANCiAgICAgICAgICAgICAgICAgICAgeCA9ICdJbmNvbWUnLA0KICAgICAgICAgICAgICAgICAgICB5ID0gJ0xpZmUgRXhwZWN0YW5jeScpICsNCiAgICAgICAgICAgdHJhbnNpdGlvbl90aW1lKHllYXIpICsNCiAgICAgICAgICAgZWFzZV9hZXMoJ2xpbmVhcicpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHMxKQ0KIyMjDQphbmltYXRlKGxpZmVFeHAuYW5pbWUsIGZwcz0zLCBkdXJhdGlvbiA9IDIwLCByZW5kZXJlciA9IGdpZnNraV9yZW5kZXJlcigpKQ0KYGBgDQoNClRoaXMgc2NhdHRlcnBsb3QgdXNlcyBpbmNvbWUgYW5kIGxpZmUgZXhwZWN0YW5jeSBvZiBlYWNoIGNvdW50cnkgYmV0d2VlbiAxODAwIGFuZCAyMDE4IGFzIHRoZSB0d28gdmFyaWFibGVzIGRlZmluaW5nIHRoZSBheGVzLiBUaGVyZWZvcmUsIHRoZXkgd2lsbCBiZSB0aGUgdmFyaWFibGVzIHRvIGJlIGNvbXBhcmVkLiBUaGUgc2l6ZSBvZiBlYWNoIHBvaW50IHJlcHJlc2VudHMgdGhhdCBjb3VudHJ5J3MgcG9wdWxhdGlvbiBzaXplLiBUaGUgY29sb3Igb2YgZWFjaCBwb2ludCByZXByZXNlbnRzIHRoZSByZWdpb24gb3IgY29udGluZW50IGluIHdoaWNoIGVhY2ggY291bnRyeSByZXNpZGVzLiBGcm9tIDE4MDAgdG8gMjAxOCwgaXQgaXMgc2VlbXMgYXBwYXJlbnQgdGhhdCBpbmNvbWUgYW5kIGxpZmUgZXh4cGVjdGFuY3kgaW4gYWxsIGNvdW50cmllcyBpbmNyZWFzZWQgb3ZlciB0aW1lLiBMaWZlIGV4cGVjdGFuY3kgc2VlbXMgdG8gaW5jcmVhc2Ugb3ZlciB0aW1lIGFzIGluY29tZSBkb2VzIGFzIHdlbGwuIEluY29tZSBhbmQgbGlmZSBleHBlY3RhbmN5IHNlZW1lZCB0byBpbmNyZWFzZSBmYXN0ZXIgb3ZlciB0aGUgeWVhcnMgZm9yIGNvdW50cmllcyBpbiBFdXJvcGUgY29tcGFyZWQgdG8gb3RoZXIgY291bnRyaWVzIGluIG90aGVyIHJlZ2lvbnMuIE9uIHRoZSBvdGhlciBoYW5kLCBjb3VudHJpZXMgaW4gQWZyaWNhIGhhZCB0aGVpciBpbmNvbWUgYW5kIGxpZmUgZXhwZWN0YW5jaWVzIGluY3JlYXNlIG11Y2ggc2xvd2VyIGNvbXBhcmVkIHRvIG90aGVyIHJlZ2lvbnMuIE1vc3QgQWZyaWNhbiBjb3VudHJpZXMgaGFkIHRoZSBsb3dlc3QgbGlmZSBleHBlY3RhbmNpZXMgb2YgYWxsIGZvciBtb3N0IHllYXJzLiBBbHNvLCB0aGUgc3BlZWQgb2YgaW5jb21lIGFuZCBsaWZlIGV4cGVjdGFuY3kgZm9yIEFzaWFuIGNvdW50cmllcyBvdmVyIHRoZSB5ZWFycyBzZWVtZWQgdG8gYmUgbW9zdGx5IGluIGJldHdlZW4gdGhlIHNwZWVkcyBmb3IgRXVyb3BlYW4gYW5kIEFmcmljYW4gY291bnRyaWVzIGFzIGFscmVhZHkgbWVudGlvbmVkLg0K